Skip to content

34.1 在 IIS 部署

精简发布文件如果需要精简发布后的文件,也就是删除不必要的文件夹,可以编辑 Web 项目的 .csproj 并添加 <SatelliteResourceLanguages>en-US</SatelliteResourceLanguages>,如:

<PropertyGroup>  
  <TargetFramework>net6.0</TargetFramework>  
  <SatelliteResourceLanguages>en-US</SatelliteResourceLanguages>  
</PropertyGroup>  

若无需生成 .pdb 文件,可以继续添加:

<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">  
  <DebugType>none</DebugType>  
  <DebugSymbols>false</DebugSymbols>  
</PropertyGroup>  

34.1.1 发布网站​

34.1.1.1 选择启动项发布​

34.1.1.2 选择发布到文件夹​

34.1.1.3 配置发布后路径​

34.1.1.4 点击发布​

34.1.2 服务器环境配置​

34.1.2.1 第一步​

安装.NET Core 运行时捆绑包:点击下载

34.1.2.2 第二步(命令)​

net stop was /y  

34.1.2.3 第三步(命令)​

net start w3svc  

34.1.2.4 第四步(命令)​

set ASPNETCORE_ENVIRONMENT=Production  

34.1.3 部署到 IIS​

34.1.3.1 添加新网站​

34.1.3.2 配置网站信息​

34.1.3.3 配置应用程序池​

34.1.3.4 设置为 非托管​

34.1.3.5 重启网站​

只需重启网站或应用程序池即可。

34.1.4 常见问题​

34.1.4.1 405 状态码,不支持 PUT,DELETE 请求​

默认情况下,IIS拒绝 PUT和 DELETE 请求,原因为 IIS 默认注册了一个名为 WebDAVModule 的自定义 HttpModule 导致的。

解决该问题,只需要在 web.config 移除即可:

<configuration>  
 <system.webServer>  
   <modules runAllManagedModulesForAllRequests="true">  
     <remove name="webDAVModule"/>  
   </modules>  
 </system.webServer>  
</configuration>  

微软官方文档:https://docs.microsoft.com/zh-cn/troubleshoot/developer/webapps/iis/health-diagnostic-performance/http-error-405-website

34.1.4.2 WebSocket/ SignalR 连接报错​

如果项目部署在 IIS 中出现 WebSoket/SignalR 不能连接或连接失败等问题,请确保 IIS 服务中的 WebSocket 协议 是勾选状态

34.1.4.3 部署之后缺失 api-ms-win.xxxx.dll 问题​

有时候将发布文件发布到服务器后,出现丢失 api.ms-win.xxxx.dll 文件,这时只需要重新发布并选择服务器特定的架构即可。

34.1.5 IIS 回收问题和配置​

通过 IIS 部署 .NET Core 应用程序,如果启动了系统日志,就会发现经常出现 Application is shutting down... 的日志,代表 IIS 回收了应用程序池。

对于一个长期在线的网站来说,这是非常不合理的,所以我们可以通过以下配置让 IIS 进行长时间不访问便回收的机制。


配置步骤如下:

  1. 打开 IIS 并点击左侧树根节点(计算机名称)并点击右侧的 Configuration Editor(配置编辑器)

2. 在 Section(节)选择 system.applicationHost/applicationPools 并设置 startMode 为 AlwaysRunning,之后点击 Apply 保存。

3. 点击左侧树根节点(计算机名称)下的 Application Pools 并点击最右侧的 Set Appliation Pool Defaults...(设置应用程序池默认配置...)

4. 设置 Idle Time-out (minutes)(闲置超时(分钟)为 0

这样即可解决 IIS 回收问题。

34.1.6 卷影(无占用)复制发布替换​

正常情况下如果我们代码重新发布后替换 IIS 中的文件,这时候会出现文件占用无法进行替换,过去运维人员都是先停止站点后替换再启动。但我们也可以配置 web.config 文件启用卷影复制模式实现类似热更新操作,如:

<?xml version="1.0" encoding="utf-8"?>  
<configuration>  
  <!-- To customize the asp.net core module uncomment and edit the following section.  
  For more info see https://go.microsoft.com/fwlink/?linkid=838655 -->  

  <system.webServer>  
    <handlers>  
      <remove name="aspNetCore"/>  
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModulev2" resourceType="Unspecified"/>  
    </handlers>  
    <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout">  
      <handlerSettings>  
        <handlerSetting name="experimentalEnableShadowCopy" value="true" />  
        <handlerSetting name="shadowCopyDirectory" value="../ShadowCopyDirectory/" />  
        <!-- Only enable handler logging if you encounter issues-->  
        <!--<handlerSetting name="debugFile" value=".\logs\aspnetcore-debug.log" />-->  
        <!--<handlerSetting name="debugLevel" value="FILE,TRACE" />-->  
      </handlerSettings>  
    </aspNetCore>  
  </system.webServer>  
</configuration>  

关于卷影复制更多知识可查看以下文档:

34.1.7 反馈与建议​

与我们交流给 Furion 提 Issue。